import { message } from "antd"
import { FCWebClient, FCWebBodyType, FCWebErrorType } from "@network"
import { session } from '@core'
import { useMapMainContext } from '@contexts/mapMainContext'

const IsLogin = () => {
  const { isMap } = useMapMainContext()
  if (isMap) return
  window.location = window.location.origin
  return isMap
}

const riskClient = new FCWebClient({
  host: 'risk-map-api',
  bodyType: FCWebBodyType.json,
  // baseHeaders: {
  //   systemtype: '00',
  // },
  authHeaders: () => {
    return {
      token: session.get('token')
    }
  },
  timeout: '25000'
})

/* 服务端返回的 error code 类型 */
// const risk_error_code = {
//   auth_fail1: '1001', // 用户未登录或登录已过期
//   auth_fail2: '1003', // Token无效或过期
// }

/**
 * 将当前服务端的返回结构转换为标准结构: { data, error: { type, code, message } }
 */
riskClient.onBeforeSuccess = (response) => {

  //通过判断response.data是否是ArrayBuffer二进制存储数据（文件流）来确定是否需要后续 code 的校验
  if (response.data?.byteLength > 0) {
    //byteLength文件流字节
    try {
      const enc = new TextDecoder('utf-8');
      const JsonData = JSON.parse(enc.decode(new Uint8Array(response.data)))

      response.data = JsonData

    } catch (error) {

      return { data: response.data }

    }
    
  }

  // 根据服务端返回数据结构进行解构
  const { code, data, message } = response.data

  // 业务成功, 包装成 { data }
  if (code === '0000') {
    return { data }
  } 
  
  // 业务失败，包装成 { error: { type, code, message } }

  // api error
  let type = FCWebErrorType.api

  // auth fail
  // if (code === risk_error_code.auth_fail) {
  //   type = FCWebErrorType.auth
  // }
  if (code.startsWith('1') && code !== '1002') {
    type = FCWebErrorType.auth
  }

  const error = { type, code, message: message }
  return ({ error })
}

/**
 * 根据不同的错误类型，决定集中处理方式
 * selfCare 指定当前错误是否由接口调用方自行处理
 */
riskClient.onError = (error, selfCare=false) => {

  if (error.type === FCWebErrorType.auth) {
    session.clear()
    message.error(error.message)
    window.location = window.location.origin
    return
  }

  // 集中处理 error
  if (!selfCare) {
    message.error(error.message)
  }
}

export default riskClient
